home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / progem.arc / sources.arc / GEMCL2.C < prev    next >
Text File  |  1987-10-05  |  4KB  |  166 lines

  1. >>>>>>>>>>>>>>>>>>>>>>>>>> Sample Redraw Code <<<<<<<<<<<<<<<<<<<<<<<<<<<<    
  2.  
  3.     VOID
  4. do_redraw(wh, area)        /* wh = window handle from msg[3] */
  5.     WORD    wh;        /* area = pointer to redraw rect- */
  6.     GRECT    *area;        /*   tangle in msg[4] thru msg[7] */
  7.     {
  8.     GRECT    box;
  9.  
  10.     graf_mouse(M_OFF, 0x0L);
  11.     wind_update(BEG_UPDATE);
  12.  
  13.     wind_get(wh, WF_FIRSTXYWH, &box.g_x, &box.g_y, &box.g_w, &box.g_h);
  14.     while ( box.g_w && box.g_h )
  15.         {
  16.         if (rc_intersect(full, &box))      /* Full is entire screen */
  17.         if (rc_intersect(area, &box))
  18.             {
  19.             if (wh == w1_handle)      /* Test for window 1 handle */
  20.                 {          /* AES redraw example          */
  21.                 objc_draw(w1_tree, ROOT, MAX_DEPTH, box.g_x, 
  22.                     box.g_y, box.g_w, box.g_h);
  23.                 }
  24.             else if (wh == w2_handle) /* Test for window 2 handle */
  25.                 {          /* VDI redraw example          */
  26.                 set_clip(TRUE, &box);
  27.                 /*  Put VDI drawing calls here */
  28.                 }
  29.             /* add more windows here */
  30.             }
  31.         wind_get(wh, WF_NEXTXYWH, &box.g_x, &box.g_y, &box.g_w, 
  32.             &box.g_h);
  33.         }
  34.  
  35.     wind_update(END_UPDATE);
  36.     graf_mouse(M_ON, 0x0L);
  37.     }
  38.  
  39. >>>>>>>>>>>>>>>>>>>>>>>>> Utilities used in do_redraw <<<<<<<<<<<<<<<<<<<<<<<
  40.  
  41.     VOID
  42. set_clip(clip_flag, area)    /* set clip to specified area    */
  43.     WORD    clip_flag;
  44.     GRECT    *area;
  45.     {
  46.     WORD    pxy[4];
  47.  
  48.     grect_to_array(area, pxy);
  49.     vs_clip(vdi_handle, clip_flag, pxy);
  50.     }
  51.  
  52.     VOID
  53. grect_to_array(area, array)    /* convert x,y,w,h to upr lt x,y and    */
  54.     GRECT    *area;        /*              lwr rt x,y    */
  55.     WORD    *array;
  56.     {
  57.     *array++ = area->g_x;
  58.     *array++ = area->g_y;
  59.     *array++ = area->g_x + area->g_w - 1;
  60.     *array = area->g_y + area->g_h - 1;
  61.     }
  62.  
  63.     WORD
  64. rc_intersect(p1, p2)        /* compute intersect of two rectangles    */
  65.     GRECT    *p1, *p2;
  66.     {
  67.     WORD    tx, ty, tw, th;
  68.  
  69.     tw = min(p2->g_x + p2->g_w, p1->g_x + p1->g_w);
  70.     th = min(p2->g_y + p2->g_h, p1->g_y + p1->g_h);
  71.     tx = max(p2->g_x, p1->g_x);
  72.     ty = max(p2->g_y, p1->g_y);
  73.     p2->g_x = tx;
  74.     p2->g_y = ty;
  75.     p2->g_w = tw - tx;
  76.     p2->g_h = th - ty;
  77.     return( (tw > tx) && (th > ty) );
  78.     }
  79.  
  80. >>>>>>>>>>>>>>>>>>>>>>>>> "Self-redraw" Utility <<<<<<<<<<<<<<<<<<<<<<<<<<<
  81.  
  82.     VOID
  83. send_redraw(wh, p)
  84.     WORD    wh;
  85.     GRECT    *p;
  86.     {
  87.     WORD    msg[8];
  88.  
  89.     msg[0] = WM_REDRAW;        /* Defined in GEMBIND.H        */
  90.     msg[1] = gl_apid;        /* As returned by appl_init */
  91.     msg[2] = 0;
  92.     msg[3] = wh;            /* Handle of window to redraw */
  93.     msg[4] = p->g_x;
  94.     msg[5] = p->g_y;
  95.     msg[6] = p->g_w;
  96.     msg[7] = p->g_h;
  97.     appl_write(gl_apid, 16, &msg);    /* Use ADDR(msg) for portability */
  98.     }
  99.  
  100. >>>>>>>>>>>>>>>>>>>>>> Utilities for Window Requests <<<<<<<<<<<<<<<<<<<<
  101.  
  102.     VOID
  103. rc_constrain(pc, pt)
  104.     GRECT        *pc;
  105.     GRECT        *pt;
  106.     {
  107.     if (pt->g_x < pc->g_x)
  108.         pt->g_x = pc->g_x;
  109.     if (pt->g_y < pc->g_y)
  110.         pt->g_y = pc->g_y;
  111.     if ((pt->g_x + pt->g_w) > (pc->g_x + pc->g_w))
  112.         pt->g_x = (pc->g_x + pc->g_w) - pt->g_w;
  113.     if ((pt->g_y + pt->g_h) > (pc->g_y + pc->g_h))
  114.         pt->g_y = (pc->g_y + pc->g_h) - pt->g_h;
  115.     }
  116.  
  117.     WORD
  118. align(x,n)        /* Snap position x to an n-bit grid         */ 
  119.     WORD     x, n;   /* Use n = 16 for horizontal word alignment */
  120.     {
  121.     x += (n >> 2) - 1;        /* Round and... */
  122.     x = n * (x / n);        /* remove residue */
  123.     return (x);
  124.     }    
  125.  
  126. >>>>>>>>>>>>>>>>>>>>>>>>> Window full utility <<<<<<<<<<<<<<<<<<<<<<<<<<
  127.  
  128.     VOID
  129. hndl_full(wh)        /* depending on current window state, make window    */
  130.     WORD    wh;    /*   full size -or- return to previous shrunken size */
  131.     {        /* graf_ calls are optional special effects.         */
  132.     GRECT    prev;
  133.     GRECT    curr;
  134.     GRECT    full;
  135.  
  136.     wind_get(wh, WF_CXYWH, &curr.g_x, &curr.g_y, &curr.g_w, &curr.g_h);
  137.     wind_get(wh, WF_PXYWH, &prev.g_x, &prev.g_y, &prev.g_w, &prev.g_h);
  138.     wind_get(wh, WF_FXYWH, &full.g_x, &full.g_y, &full.g_w, &full.g_h);
  139.     if ( rc_equal(&curr, &full) )
  140.         {        /* Is full, change to previous         */
  141.         graf_shrinkbox(prev.g_x, prev.g_y, prev.g_w, prev.g_h,
  142.             full.g_x, full.g_y, full.g_w, full.g_h);
  143.         wind_set(wh, WF_CXYWH, prev.g_x, prev.g_y, prev.g_w, prev.g_h);
  144.                 /* put send_redraw here if you need it */
  145.         }
  146.     else
  147.         {        /* is not full, so set to full        */
  148.         graf_growbox(curr.g_x, curr.g_y, curr.g_w, curr.g_h,
  149.             full.g_x, full.g_y, full.g_w, full.g_h);
  150.         wind_set(wh, WF_CXYWH, full.g_x, full.g_y, full.g_w, full.g_h);
  151.         }
  152.     }
  153.  
  154.     WORD
  155. rc_equal(p1, p2)        /* tests for two rectangles equal    */
  156.     GRECT    *p1, *p2;
  157.     {
  158.     if ((p1->g_x != p2->g_x) ||
  159.         (p1->g_y != p2->g_y) ||
  160.         (p1->g_w != p2->g_w) ||
  161.         (p1->g_h != p2->g_h))
  162.         return(FALSE);
  163.     return(TRUE);
  164.     }
  165.  
  166.